/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package automate;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.Timer;

/**
 *
 * @author S219
 */
public class Diapositives extends javax.swing.JFrame {
    
    private int etat;
    
    private JSplitPane separation_images_boutons;
    private JPanel panel_haut;
    private JPanel panel_bas;
    private JPanel panel_general;
    private GridLayout grille_images;
    
    private JPanel temporaire;
    
    private JLabel image1;
    private JLabel image2;
    private JLabel image3;
    private JLabel image4;
    private JLabel image5;
    private JLabel image6;
    private JLabel image7;
    private JLabel image8;
    private JLabel image9;
    
    private JLabel image_selectionnee;
    private JLabel image_en_cours;

    private JButton lancer_arreter;
    private JButton stop;
    private JButton reculer;
    private JButton avancer;
    
    private ArrayList<JLabel> liste_images;

    //hashmap pour pouvoir déterminer quelle est la suivante ou précèdente...
    //pas opti car il aurait fallu changer pour une LinkedList 
    private HashMap<JLabel,JLabel> liste_pour_defilement;
    private HashMap<JLabel, JLabel> liste_pour_defilement_inverse;
    
    private Timer timer;
    
    private LinkedList<JLabel> liste_defilement;

    /**
     * constructeur
     */
    public Diapositives() throws IOException {
        initComponents();
        this.setSize(610,650);
        panel_general = new JPanel();
        panel_general.setSize(600,600);
        panel_general.setLayout(new BorderLayout());
        
        panel_general.setBackground(Color.WHITE);
        
        panel_haut = new JPanel();
        
        panel_bas = new JPanel();
        panel_bas.setLayout(new GridLayout(1,4,5,5));
        
        //création des images
        this.creerImages();
        
        //création du panel contenant les images et du panel contenant les bouttons
        this.remplir_panel_haut();
        this.remplir_panel_bas();
       
        panel_general.add(panel_haut, BorderLayout.CENTER);
        panel_general.add(panel_bas, BorderLayout.SOUTH);
        this.add(panel_general);
        
        timer = new Timer(0, new TimerListener(this));
        
        etat = 0;
        image_selectionnee = null;
        image_en_cours = null;
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents


    // Variables declaration - do not modify//GEN-BEGIN:variables
    // End of variables declaration//GEN-END:variables

    
    /**
    *Remplit le panel haut avec les images
    */
    private void remplir_panel_haut() throws IOException {            
        panel_haut.setLayout(new GridLayout(3,3,5,5));
        this.insererImages();
    }
    
    /**
     * Remplit le panel bas avec les boutons
     * @throws IOException 
     */
    private void remplir_panel_bas() throws IOException {
        
        reculer = new JButton(new ImageIcon(ImageIO.read(getClass().getResource("/img/reculer.png"))));
        reculer.addActionListener(new ReduireVitesseListener(this));
        
        lancer_arreter = new JButton(new ImageIcon(ImageIO.read(getClass().getResource("/img/play.png"))));
        lancer_arreter.addActionListener(new LancerArreterListener(this));
        
        stop = new JButton(new ImageIcon(ImageIO.read(getClass().getResource("/img/stop.png"))));
        stop.addActionListener(new StopListener(this));
        
        avancer = new JButton(new ImageIcon(ImageIO.read(getClass().getResource("/img/avancer.png"))));
        avancer.addActionListener(new AugmenterVitesseListener(this));
        
        this.setBoutonsArret();
        
        panel_bas.add(reculer);
        panel_bas.add(lancer_arreter);
        panel_bas.add(stop);
        panel_bas.add(avancer);
        
    }
    
    
    /**
     * Mise en route du défilement
     * @throws IOException 
     */
    public void MettreEnRoute() throws IOException {
        //on active les boutons
        this.setBoutonsEnRoute();
        
        //si on avait selectionné une image on enlève la border
        if(image_selectionnee != null)
            image_selectionnee.setBorder(BorderFactory.createEmptyBorder());
        else //sinon on commencer par la premiere
            image_selectionnee = liste_images.get(0);
        
        //on lance le défilement
        System.out.println("on lance...");
        
        timer.setDelay(3000);
        timer.start();
    }
    
    /**
     * Met les boutons dans le bon état pour la mise en route
     * @throws IOException 
     */
    private void setBoutonsEnRoute() throws IOException{
        reculer.setEnabled(true);
        stop.setEnabled(true);
        avancer.setEnabled(true);
        lancer_arreter.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("/img/pause.png"))));
    }
    
    /**
     * Met les boutons dans le bon état quand on est à l'arrêt
     * @throws IOException 
     */
    private void setBoutonsArret() throws IOException{
        reculer.setEnabled(false);
        stop.setEnabled(false);
        avancer.setEnabled(false);
        lancer_arreter.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("/img/play.png"))));
    }

    /**
     * Retour à l'état initial (affichage vignettes)
     * @throws IOException 
     */
    void retourEtatInitial() throws IOException {
       
        System.out.println("retour Etat Initial");
        
        image_selectionnee = null;
        image_en_cours = null;
        
        panel_haut.removeAll();
        this.remplir_panel_haut();
        this.setBoutonsArret();
    }

    /**
     * insère les images dans le panel haut
     */
    private void insererImages() {
        for(JLabel img : liste_images ){
            panel_haut.add(img);
        }
        this.validate();
        this.repaint();
    }
    
    /**
     * Met à jour l'image pendant le défilement
     * @param diapo 
     */
    private void miseAJourImage(JLabel diapo){
        this.image_en_cours = diapo;
        panel_haut.removeAll();
        
        //on met le gridlayout a 1 col et 1 ligne
        panel_haut.setLayout(new GridLayout(1, 1));
        panel_haut.add(diapo);

        this.validate();
        this.repaint();
    }

    /**
     * Création des jpanel pour les images
     * @throws IOException 
     */
    private void creerImages() throws IOException {
        liste_images = new ArrayList<>();
//        liste_images = new LinkedList<>();
        
        image1 = new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/img/chat.jpg"))));
        image1.setName("image 1");
        image1.addMouseListener(new ImageListener(image1,panel_haut,this));
        liste_images.add(image1);
        
        image2 = new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/img/chat2.jpg"))));
        image2.setName("image 2");
        image2.addMouseListener(new ImageListener(image2,panel_haut, this));
        liste_images.add(image2);
        
        image3 = new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/img/chat3.jpg"))));
        image3.setName("image 3");
        image3.addMouseListener(new ImageListener(image3,panel_haut, this));
        liste_images.add(image3);
        
        image4 = new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/img/chat4.jpg"))));
        image4.setName("image 4");
        image4.addMouseListener(new ImageListener(image4,panel_haut, this));
        liste_images.add(image4);
        
        image5 = new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/img/chat5.jpg"))));
        image5.addMouseListener(new ImageListener(image5,panel_haut, this));
        image5.setName("image 5");
        liste_images.add(image5);
        
        image6 = new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/img/chat6.jpg"))));
        image6.addMouseListener(new ImageListener(image6,panel_haut, this));
        image6.setName("image 6");
        liste_images.add(image6);
        
        image7 = new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/img/chat7.jpg"))));
        image7.addMouseListener(new ImageListener(image7,panel_haut, this));
        image7.setName("image 7");
        liste_images.add(image7);
        
        image8 = new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/img/chat8.jpeg"))));
        image8.addMouseListener(new ImageListener(image8,panel_haut, this));
        image8.setName("image 8");
        liste_images.add(image8);
        
        image9 = new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/img/chat9.jpeg"))));
        image9.addMouseListener(new ImageListener(image9,panel_haut, this));
        image9.setName("image 9");
        liste_images.add(image9);
        
        
        liste_pour_defilement = new HashMap<>();
        liste_pour_defilement.put(image1, image2);
        liste_pour_defilement.put(image2, image3);
        liste_pour_defilement.put(image3, image4);
        liste_pour_defilement.put(image4, image5);
        liste_pour_defilement.put(image5, image6);
        liste_pour_defilement.put(image6, image7);
        liste_pour_defilement.put(image7, image8);
        liste_pour_defilement.put(image8, image9);
        liste_pour_defilement.put(image9, image1);
        
        
        liste_pour_defilement_inverse = new HashMap<>();
        liste_pour_defilement_inverse.put(image1, image9);
        liste_pour_defilement_inverse.put(image2, image1);
        liste_pour_defilement_inverse.put(image3, image2);
        liste_pour_defilement_inverse.put(image4, image3);
        liste_pour_defilement_inverse.put(image5, image4);
        liste_pour_defilement_inverse.put(image6, image5);
        liste_pour_defilement_inverse.put(image7, image6);
        liste_pour_defilement_inverse.put(image8, image7);
        liste_pour_defilement_inverse.put(image9, image8);
    }
    
    
        /**
     * Permet de passer à la diapo suivante (marche avant)
     */
    public void diapoSuivante() {
        System.out.println("DIAPO SUIVANTE");
        
        //si on a rien selectionné avant de lancer
        if(image_en_cours == null) {
            this.miseAJourImage(image_selectionnee);
            this.image_en_cours = image_selectionnee;
            this.miseAJourImage(this.image_en_cours);
        }
        else {
            this.miseAJourImage(liste_pour_defilement.get(image_en_cours));
        }
    }
    
    /**
     * Affiche la diapositive précedente (marche arrière)
     */
    void diapoPrecedente() {
        System.out.println("DIAPO PRECEDENTE");
        
        //System.out.println(liste_pour_defilement_inverse.get(image_en_cours).getName());
        this.miseAJourImage(liste_pour_defilement_inverse.get(image_en_cours));
    }
    
    /**
     * Désactive le bouton avancer '>>'
     */
    public void desactiverBoutonAvancer() {
        this.avancer.setEnabled(false);
    }
    /**
     * Active le bouton avancer : '>>'
     */
    public void activerBoutonAvancer() {
        this.avancer.setEnabled(true);
    }

    /**
     * Désactive le bouton reculer '<<'
     */
    public void desactiverBoutonReculer() {
        this.reculer.setEnabled(false);
    }
    
    /**
     * Active le bouton reculer '<<'
     */
    public void activerBoutonReculer() {
        this.reculer.setEnabled(true);
    }

    /**
     * Met en pause l'application (seulement pendant défilement).
     * Reste sur l'image en cours
     * @throws IOException 
     */
    void mettreEnPause() throws IOException {
        this.desactiverBoutonAvancer();
        this.desactiverBoutonReculer();
        timer.stop();
        lancer_arreter.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("/img/play.png"))));
    }

    /**
     * Remet en route l'application (après une pause)
     * @throws IOException 
     */
    void remettreEnRoute() throws IOException {
        if(etat != 4) this.activerBoutonAvancer();
        this.activerBoutonReculer();
        timer.start();
        lancer_arreter.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("/img/pause.png"))));
    }

    
    
    /****************** GETTERS AND SETTERS ***********************/
     
    
    public Timer getTimer() {
        return timer;
    }
    
    public JLabel getImage_selectionnee() {
        return image_selectionnee;
    }

    public void setImage_selectionnee(JLabel image_selectionnee) {
        this.image_selectionnee = image_selectionnee;
    }
    
    public JLabel getImage_en_cours() {
        return image_en_cours;
    }

    public void setImage_en_cours(JLabel image_en_cours) {
        this.image_en_cours = image_en_cours;
    }
    
    public int getEtat(){
        return etat;
    }
    
    public void setEtat(int etat){
        this.etat = etat;
    }
    
}
